package com.example.myweb.Service.Auth.Impl;

import com.example.myweb.Domain.Entity.Article;
import com.example.myweb.Domain.Entity.Collection;
import com.example.myweb.Domain.Entity.User;
import com.example.myweb.Dto.ArticleSummaryDTO;
import com.example.myweb.Dto.AuthorInfoDTO;
import com.example.myweb.Exception.CustomException;

import com.example.myweb.Repository.JpaRepository.ArticleRepository;
import com.example.myweb.Repository.JpaRepository.CollectionRepository;
import com.example.myweb.Service.Auth.CollectionService;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Service
public class CollectionServiceImpl implements CollectionService {

    @Autowired
    private CollectionRepository collectionRepository;
    @Autowired
    private ArticleRepository articleRepository;



    /**
     * 实现获取用户收藏列表的方法
     */
    @Override
    @Transactional(readOnly = true)
    public Page<ArticleSummaryDTO> getUserCollections(User currentUser, Pageable pageable) {
        // 1. 从 Repository 中分页查询出用户的收藏记录 (Collection 实体)
        Page<Collection> collectionPage = collectionRepository.findByUser(currentUser, pageable);

        // 2. 使用 Page.map() 将 Page<Collection> 转换为 Page<ArticleSummaryDTO>
        //    转换逻辑由下面的 private 方法提供
        return collectionPage.map(this::convertCollectionToArticleSummaryDto);
    }

    /**
     * 辅助转换方法：将 Collection 实体转换为你已有的 ArticleSummaryDTO
     * @param collection 数据库中的收藏记录实体
     * @return 用于前端列表展示的文章摘要DTO
     */
    private ArticleSummaryDTO convertCollectionToArticleSummaryDto(Collection collection) {
        // 从收藏记录中获取到关联的文章实体
        Article article = collection.getArticle();

        // 防御性编程：如果关联的文章因某种原因不存在，则返回null或一个空的DTO
        if (article == null) {
            return null;
        }

        // 创建并填充 ArticleSummaryDTO
        ArticleSummaryDTO dto = new ArticleSummaryDTO();
        dto.setArticleId(article.getArticleId());
        dto.setTitle(article.getTitle());

        // 生成摘要
        String content = article.getContent();
        if (content != null) {
            dto.setSummary(content.substring(0, Math.min(content.length(), 100)) + "...");
        } else {
            dto.setSummary(""); // 如果内容为空，提供一个空摘要
        }

        // 填充作者信息
        User author = article.getAuthor();
        if (author != null) {
            dto.setAuthor(new AuthorInfoDTO(
                    author.getUserId(),
                    author.getNickname(),
                    author.getAvatarUrl()
            ));
        }

        // 填充文章的统计数据和发布时间
        dto.setPublishTime(article.getPublishTime());
        dto.setLikeCount(article.getLikeCount());
        dto.setCommentCount(article.getCommentCount());
        dto.setCollectionCount(article.getCollectionCount());

        // 注意：你的DTO里没有 collectionTime，所以我们就不设置它了。
        // 如果未来需要在收藏列表里显示收藏时间，而不是发布时间，
        // 只需在ArticleSummaryDTO里增加一个 aollectionTime 字段，并在这里赋值即可。
        // dto.setCollectionTime(collection.getCollectionTime());

        return dto;
    }
    @Override
    @Transactional
    public void createCollection(User currentUser, Long articleId) {
        // 1. 检查文章是否存在
        Article article = articleRepository.findById(articleId)
                .orElseThrow(() -> new CustomException("要收藏的文章不存在", HttpStatus.NOT_FOUND));

        // 2. 检查是否已收藏
        if (collectionRepository.existsByUserAndArticle_ArticleId(currentUser, article.getArticleId())) {
            return; // 已收藏，直接返回
        }

        // 3. 创建收藏记录
        Collection newCollection = new Collection();
        newCollection.setUser(currentUser);
        newCollection.setArticle(article);
        collectionRepository.save(newCollection);

        // 4. 更新文章的收藏数
        article.setCollectionCount(article.getCollectionCount() + 1);
        articleRepository.save(article);
    }

    @Override
    @Transactional
    public void deleteCollection(User currentUser, Long articleId) {
        // 1. 查找收藏记录
        Optional<Collection> collectionOpt = collectionRepository.findByUserAndArticle_ArticleId(currentUser, articleId);

        if (collectionOpt.isPresent()) {
            Collection collection = collectionOpt.get();
            // 2. 删除收藏记录
            collectionRepository.delete(collection);

            // 3. 更新文章的收藏数
            Article article = collection.getArticle();
            article.setCollectionCount(Math.max(0, article.getCollectionCount() - 1));
            articleRepository.save(article);
        }
    }
}